package com.hqyj.service.impl;

import com.hqyj.exception.R;
import com.hqyj.pojo.BuyCar;
import com.hqyj.pojo.Item;
import com.hqyj.service.BuyCarService;
import com.hqyj.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class BuyCarServiceImpl implements BuyCarService {

    //注入redis
    @Autowired
    RedisTemplate<String,Object> redisTemplate;
    @Override
    public R addBuyCar(Item item, HttpServletRequest request) {
        log.info("---购物车添加商品业务--");
        //---------获取用户名--------
        String token =  request.getHeader("Authorization");
        String userName = JwtUtil.getClaimByName(token,"userName").toString();
        //创建购物车键名
        String key = "buyCar:"+userName;
        //创建商品id的键名
        String keyId = "buyCar:id:"+userName;
        //获取这个商品信息
        Object obj = redisTemplate.opsForHash().get(key,item.getGoodsId().toString());
        //判断购物车中的这个商品是否存在
        if(obj==null){
            log.info("---在购物车中添加新商品---");
            //计算商品金额
            item.setMoney(item.getGoodsPrice()*item.getNumber());
            //添加商品
            redisTemplate.opsForHash().put(key,item.getGoodsId().toString(),item);

            //记录商品id
            redisTemplate.opsForList().leftPush(keyId,item.getGoodsId());

        }else{
            log.info("---在购物车中更新商品数量---");
            //获取redis中的商品
            Item m = (Item)obj;
            //增加商品数量
            int num = m.getNumber()+item.getNumber();
            m.setNumber(num);
            //计算商品金额
            m.setMoney(m.getGoodsPrice()*num);
            //添加商品
            redisTemplate.opsForHash().put(key,item.getGoodsId().toString(),m);

        }
        return R.ok();
    }

    @Override
    public R showBuyCar(HttpServletRequest request) {
        log.info("---购物车展示业务--");
        //---------获取用户名--------
        String token =  request.getHeader("Authorization");
        String userName = JwtUtil.getClaimByName(token,"userName").toString();
        //创建购物车键名
        String key = "buyCar:"+userName;
        //创建商品id的键名
        String keyId = "buyCar:id:"+userName;
        //获取购物车中的商品id信息
        Object obj  = redisTemplate.opsForList().range(keyId,0,-1);
        //转换商品信息
        List<Integer> listId = (List<Integer> )obj;
        //判断购物车是否有商品
        if(listId.size()==0){
            log.info("购物车没有商品");
            return R.error("购物车没有商品");
        }

        //创建购物车对象
        BuyCar buyCar = new BuyCar();
        //创建商品列表
        List<Item> itemList = new LinkedList<>();
        //定义购物车总金额
        double totalPrice=0;
        //遍历
        for(Integer s:listId){
            //获取商品信息
            Item item =(Item) redisTemplate.opsForHash().get(key,s.toString());

            //把商品信息添加到商品列表中
            itemList.add(item);
            //计算总金额
            totalPrice+=item.getMoney();
        }
        //把商品信息添加到购物车中
        buyCar.setItemList(itemList);
        //设置总金额
        buyCar.setTotalPrice(totalPrice);
        log.info("显示购物车成功");
        return R.ok("success",buyCar);
    }

    @Override
    public R deleteBuyCar(Integer goodsId,HttpServletRequest request) {
        log.info("---购物车商品删除业务--");
        //---------获取用户名--------
        String token =  request.getHeader("Authorization");
        String userName = JwtUtil.getClaimByName(token,"userName").toString();
        //创建购物车键名
        String key = "buyCar:"+userName;
        //创建商品id的键名
        String keyId = "buyCar:id:"+userName;
        //获取购物车中的商品id信息
        Object obj  = redisTemplate.opsForList().range(keyId,0,-1);

        //转换商品信息
        List<Integer> listId = (List<Integer> )obj;
        if(listId.size()==0){
            log.info("没有商品可以删除");
            return R.error("没有商品可以删除");
        }
        //遍历
        for(Integer s:listId){
            if (goodsId==s){
                log.info("删除购物车中商品id="+s+"的信息");
                //删除商品列表的id
                /**
                 * remove(K key, long count, Object value)
                 * 从存储在键中的列表中删除等于值的元素的第一个计数事件。
                 * count> 0：删除等于从左到右移动的值的第一个元素；
                 * count< 0：删除等于从右到左移动的值的第一个元素；
                 * count = 0：删除等于value的所有元素。
                 *
                 */
                redisTemplate.opsForList().remove(keyId,0,s);
                //删除购物车的商品信息
                redisTemplate.opsForHash().delete(key,s.toString());
            }
        }
        log.info("购物车商品删除成功");
        return R.ok();
    }

    @Override
    public R updateBuyCar(BuyCar buyCar, HttpServletRequest request) {
        log.info("---开启购物车商品修改业务---");
        //---------获取用户名--------
        String token =  request.getHeader("Authorization");
        String userName = JwtUtil.getClaimByName(token,"userName").toString();
        //创建购物车键名
        String key = "buyCar:"+userName;
        //创建商品id的键名
        String keyId = "buyCar:id:"+userName;
        /*--------------------先删除购物车数据--------------------*/
        log.info("---先删除购物车数据----");
        //获取购物车中的商品id信息
        Object obj  = redisTemplate.opsForList().range(keyId,0,-1);
        //转换商品信息
        List<Integer> listId = (List<Integer> )obj;
        for(Integer s:listId){
            redisTemplate.opsForList().remove(keyId,0,s);
            //删除购物车的商品信息
            redisTemplate.opsForHash().delete(key,s.toString());
        }
        /*----------------再添加更新后的的购物车数据-----------------*/
        log.info("---再添加更新后的的购物车数据----");
        for(Item item:buyCar.getItemList()){
            //添加商品
            redisTemplate.opsForHash().put(key,item.getGoodsId().toString(),item);
            //记录商品id
            redisTemplate.opsForList().leftPush(keyId,item.getGoodsId());
        }

        return R.ok();
    }

    @Override
    public R clearBuyCar(HttpServletRequest request) {

        log.info("---清空购物车---");
        //---------获取用户名--------
        String token =  request.getHeader("Authorization");
        String userName = JwtUtil.getClaimByName(token,"userName").toString();
        //创建购物车键名
        String key = "buyCar:"+userName;
        //创建商品id的键名
        String keyId = "buyCar:id:"+userName;
        /*--------------------先删除购物车数据--------------------*/
        log.info("---先删除购物车数据----");
        //获取购物车中的商品id信息
        Object obj  = redisTemplate.opsForList().range(keyId,0,-1);
        //转换商品信息
        List<Integer> listId = (List<Integer> )obj;
        for(Integer s:listId){
            //删除购物车的商品Id
            redisTemplate.opsForList().remove(keyId,0,s);
            //删除购物车的商品信息
            redisTemplate.opsForHash().delete(key,s.toString());
        }
        return R.ok();
    }
}
